package com.lanyou.esb.cook.proxy.redis.proxy;

import java.io.IOException;
import java.util.List;

import redis.clients.jedis.exceptions.JedisException;

import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonMappingException;

/**
 * 针对Set数据类型的Redis代理接口
 * 
 * @author Davey.wu
 */
public interface SetJedisProxy<T> extends JedisProxy<T> {

	/**
	 * 将元素加入SET集合
	 * 
	 * @param key
	 *            ：键
	 * @param values
	 *            ：值集合
	 * @throws JsonProcessingException
	 */
	void sadd(String key, T... values) throws JedisException,
			JsonProcessingException;

	/**
	 * 将String类型的元素加入SET集合
	 * 
	 * @param key
	 *            ：键
	 * @param values
	 *            ：值集合
	 * @throws JsonProcessingException
	 */
	void saddAsStr(String key, String... values) throws JedisException,
			JsonProcessingException;

	/**
	 * 获取SET集合
	 * 
	 * @param key
	 *            ：键
	 * @return
	 * @throws JsonProcessingException
	 * @throws IOException
	 */
	List<T> smembers(String key) throws JedisException,
			JsonProcessingException, IOException;

	/**
	 * 获取String类型的SET集合
	 * 
	 * @param key
	 *            ：键
	 * @return
	 * @throws JsonProcessingException
	 * @throws IOException
	 */
	List<String> smembersAsStr(String key) throws JedisException,
			JsonProcessingException, IOException;

	/**
	 * 删除并取出一个元素
	 * 
	 * @param key
	 *            ：键
	 * @return
	 * @throws IOException
	 * @throws JsonMappingException
	 * @throws JsonParseException
	 */
	T spop(String key) throws JedisException, JsonParseException,
			JsonMappingException, IOException;

	/**
	 * 删除并取出一个String类型的元素
	 * 
	 * @param key
	 *            ：键
	 * @return
	 * @throws IOException
	 * @throws JsonMappingException
	 * @throws JsonParseException
	 */
	String spopAsStr(String key) throws JedisException, JsonParseException,
			JsonMappingException, IOException;

	/**
	 * 取出 并删除m个String类型的元素
	 * 
	 * @param key
	 *            ：键
	 * @param m
	 *            ：数量
	 * @return
	 * @throws JedisException
	 * @throws JsonParseException
	 * @throws JsonMappingException
	 * @throws IOException
	 */
	List<String> spopAsStr(String key, int m) throws JedisException,
			JsonParseException, JsonMappingException, IOException;
}
